package com.cnmts.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang3.time.DateUtils;

public class DateUtil extends DateUtils {

	/**
	 * String 转 Date
	 * 
	 * @param date
	 *            日期
	 * @param pattern
	 *            源格式
	 * @return
	 */
	public static Date string2Date(String date, String pattern) {
		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
		try {
			return dateFormat.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * Date 转 String
	 * 
	 * @param date
	 *            日期
	 * @param pattern
	 *            目标格式
	 * @return
	 */
	public static String date2String(Date date, String pattern) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);
		return dateFormat.format(date);
	}

	/**
	 * 获取年
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:14:40
	 * @param date
	 * @return
	 */
	public static int getYear() {
		return getYear(new Date());
	}

	/**
	 * 获取年
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:14:40
	 * @param date
	 * @return
	 */
	public static int getYear(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.YEAR);
	}

	/**
	 * 获取月份
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:14:55
	 * @return
	 */
	public static int getMonth() {
		return getMonth(new Date());
	}

	/**
	 * 获取月份
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:15:06
	 * @param date
	 * @return
	 */
	public static int getMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.MONTH) + 1;
	}

	/**
	 * 获取 日
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:15:10
	 * @return
	 */
	public static int getDayOfMonth() {
		return getDayOfMonth(new Date());
	}

	/**
	 * 获取 日
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:15:10
	 * @return
	 */
	public static int getDayOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		return calendar.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * 格式化字符串日期
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:16:04
	 * @param date
	 *            日期
	 * @param sourcePattern
	 *            源格式
	 * @param desPattern
	 *            目标格式
	 * @return
	 */
	public static String formatStringDate(String date, String sourcePattern, String desPattern) {
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sourcePattern);
		Date parse;
		try {
			parse = simpleDateFormat.parse(date);
			simpleDateFormat = new SimpleDateFormat(desPattern);
			return simpleDateFormat.format(parse);
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 获取当前时间
	 * 
	 * @author 王璞
	 * @date 2016年11月2日 上午11:17:35
	 * @return
	 */
	public static Date getCurrentDate() {
		return new Date();
	}

	/**
	 * 时间戳转 Date
	 * 
	 * @author 王璞
	 * @date 2017年1月10日 下午4:48:52
	 * @param milliseconds
	 * @return
	 */
	public static Date getDate(long milliseconds) {
		return new Date(milliseconds);
	}

	public static long getCurrentMilliseconds() {
		return getCurrentDate().getTime();
	}

	/**
	 * 校验日期格式是
	 * 
	 * @author 王璞
	 * @date 2016年12月8日 上午10:38:10
	 * @param dateStr
	 * @return
	 */
	public static boolean validateDate(String dateStr, String pattern) {
		String eL = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
		if (pattern.equals("yyyy-MM-dd")) {
			eL = "[0-9]{4}-[0-9]{2}-[0-9]{2}";
		} else if (pattern.equals("yyyy-MM")) {
			eL = "[0-9]{4}-[0-9]{2}";
		} else if (pattern.equals("yyyy")) {
			eL = "[0-9]{4}";
		} else if (pattern.equals("yyyy-MM-dd HH:mm")) {
			eL = "[1-2][0-9][0-9][0-9]-([1][0-2]|0?[1-9])-([12][0-9]|3[01]|0?[1-9]) ([01][0-9]|[2][0-3]):[0-5][0-9]";
		}
		Pattern p = Pattern.compile(eL);
		Matcher m = p.matcher(dateStr);
		return m.matches();
	}

	public static Date clearTime(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}

	/**
	 * 得到一个月的第一天
	 * 
	 * @author 王璞
	 * @date 2016年12月8日 下午5:02:04
	 * @param date
	 * @return
	 */
	public static Date getFirstDayOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}

	/**
	 * 得到一个月的最后一天
	 * 
	 * @author 王璞
	 * @date 2016年12月8日 下午5:02:12
	 * @param date
	 * @return
	 */
	public static Date getLastDayOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		calendar.add(Calendar.MONTH, +1);
		calendar.add(Calendar.DAY_OF_MONTH, -1);
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		return calendar.getTime();
	}

	/**
	 * 两个日期相差多少天
	 * 
	 * @author 王璞
	 * @date 2016年12月13日 下午3:40:53
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long daysDiff(Date date1, Date date2) {
		return Math.abs((date1.getTime() - date2.getTime()) / 1000 / 60 / 60 / 24);
	}

	/**
	 * 获得某一天在这个月是第几周
	 * 
	 * @author 王璞
	 * @date 2016年12月13日 下午3:25:02
	 * @param date
	 * @return
	 */
	public static int getWeekOfMonth(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setFirstDayOfWeek(Calendar.MONDAY);
		calendar.setTime(date);
		return calendar.get(Calendar.WEEK_OF_MONTH);
	}

	/**
	 * 两天是否是同一周
	 * 
	 * @author 王璞
	 * @date 2016年12月13日 下午3:28:48
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameWeek(Date date1, Date date2) {
		return getWeekOfMonth(date1) == getWeekOfMonth(date2);
	}

	/**
	 * 判断是否是同一天，如果有一个NULL则返回false
	 * 
	 * @author 王璞
	 * @date 2016年12月15日 下午2:24:47
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static boolean isSameDay(Date date1, Date date2) {
		if (date1 != null && date2 != null) {
			return DateUtils.isSameDay(date1, date2);
		} else {
			return false;
		}
	}

	private static final int[] week = new int[] { Calendar.MONDAY, Calendar.TUESDAY, Calendar.WEDNESDAY, Calendar.THURSDAY,
			Calendar.FRIDAY, Calendar.SATURDAY, Calendar.SUNDAY };

	/**
	 * 获取一周最后一天
	 * 
	 * @author 王璞
	 * @date 2016年12月15日 上午9:22:36
	 * @param date
	 * @return
	 */
	public static Date getSunDayOfWeek(Date date) {
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		for (int i = 0; i < week.length; i++) {
			if (week[i] == dayOfWeek) {
				calendar.add(Calendar.DAY_OF_MONTH, 7 - i - 1);
				return calendar.getTime();
			}
		}
		return null;
	}

	/**
	 * 获取日期差
	 * 
	 * @author xiaoming
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long daysSub(Date date1, Date date2) {
		return date1.getTime() - date2.getTime();
	}
}
